import pandas as pd
import numpy
import quantstats

# 不加这句下面的quantstats.reports.html会报错
numpy.product = numpy.prod

def main():
    data = pd.read_csv("dat1.csv", index_col=0)
    data.drop(columns='中证1000ETF', inplace=True)
    name_list = data.columns.tolist()
    # 动量长度
    N = 20
    # 计算每日涨跌幅和N日涨跌幅
    for name in name_list:
        data['日收益率_'+name] = data[name] / data[name].shift(1) - 1.0
        data['涨幅_'+name] = data[name] / data[name].shift(N+1) - 1.0
    # 去掉缺失值
    data = data.dropna()
    data[['涨幅_'+v for v in name_list]].head(10)
    # 取出每日涨幅最大的证券
    data['信号'] = data[['涨幅_'+v for v in name_list]].idxmax(axis=1).str.replace('涨幅_', '')
    # 今日的涨幅由昨日的持仓产生
    data['信号'] = data['信号'].shift(1)
    data = data.dropna()
    data['轮动策略日收益率'] = data.apply(lambda x: x['日收益率_'+x['信号']], axis=1) 
    # 第一天尾盘交易，当日涨幅不纳入
    data.loc[data.index[0],'轮动策略日收益率'] = 0.0
    data['轮动策略净值'] = (1.0 + data['轮动策略日收益率']).cumprod()
    data.index = pd.to_datetime(data.index)
    #将完整回测报告存为HTML文件
    quantstats.reports.html(data['轮动策略净值'], benchmark=data['纳指ETF'],
                  title='轮动策略回测报告 by 公众号【量化君也】',
                  output='轮动策略回测报告 by 公众号【量化君也】.html')


if __name__ == "__main__":
    main()